package com.zt.service;

import com.zt.entity.Coupons;
import com.zt.vo.CouponVO;

import java.util.List;

/**
 * 优惠券缓存服务接口
 */
public interface CouponCacheService {

    /**
     * 缓存优惠券信息
     * @param coupon 优惠券对象
     */
    void cacheCoupon(Coupons coupon);

    /**
     * 获取缓存的优惠券信息
     * @param couponId 优惠券ID
     * @return 优惠券对象
     */
    Coupons getCachedCoupon(Integer couponId);

    /**
     * 删除优惠券缓存
     * @param couponId 优惠券ID
     */
    void deleteCouponCache(Integer couponId);

    /**
     * 缓存优惠券库存
     * @param couponId 优惠券ID
     * @param stock 库存数量
     */
    void cacheStock(Integer couponId, Integer stock);

    /**
     * 获取优惠券库存
     * @param couponId 优惠券ID
     * @return 库存数量
     */
    Integer getStock(Integer couponId);

    /**
     * 减少优惠券库存
     * @param couponId 优惠券ID
     * @param count 减少数量
     * @return 剩余库存，-1表示库存不足
     */
    Long decreaseStock(Integer couponId, Integer count);

    /**
     * 增加优惠券库存
     * @param couponId 优惠券ID
     * @param count 增加数量
     * @return 增加后的库存
     */
    Long increaseStock(Integer couponId, Integer count);

    /**
     * 设置优惠券过期时间
     * @param couponId 优惠券ID
     * @param expireSeconds 过期时间（秒）
     */
    void setCouponExpire(Integer couponId, Long expireSeconds);

    /**
     * 检查优惠券是否过期
     * @param couponId 优惠券ID
     * @return 是否过期
     */
    Boolean isCouponExpired(Integer couponId);

    /**
     * 缓存用户优惠券领取记录
     * @param userId 用户ID
     * @param couponId 优惠券ID
     */
    void cacheUserCouponRecord(Integer userId, Integer couponId);

    /**
     * 获取用户已领取的优惠券数量
     * @param userId 用户ID
     * @param couponId 优惠券ID
     * @return 已领取数量
     */
    Integer getUserCouponCount(Integer userId, Integer couponId);

    /**
     * 清除所有优惠券相关缓存
     */
    void clearAllCouponCache();

    /**
     * 批量缓存优惠券列表
     * @param coupons 优惠券列表
     */
    void batchCacheCoupons(List<CouponVO> coupons);

    /**
     * 获取缓存的优惠券列表
     * @param cacheKey 缓存键
     * @return 优惠券列表
     */
    List<CouponVO> getCachedCouponList(String cacheKey);
}
